{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Stock Price Prediction with ProphetForecaster and AutoProphet (with AutoML)\n",
    "\n",
    "In this notebook, we demonstrate a reference use case where we use historical stock price data to predict the future price using the ProphetForecaster and AutoProphet. The dataset we use is the daily stock price of S&P500 stocks during 2013-2018 ([data source](https://www.kaggle.com/camnugent/sandp500/)). \n",
    "\n",
    "Reference: https://facebook.github.io/prophet, https://github.com/jwkanggist/tf-keras-stock-pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Download raw dataset and load into dataframe\n",
    "\n",
    "Now we download the dataset and load it into a pandas dataframe. Steps are as below.\n",
    "\n",
    "+ First, run the script `get_data.sh` to download the raw data. It will download daily stock price of S&P500 stocks during 2013-2018 into data folder, preprocess and merge them into a single csv file `all_stocks_5yr.csv`.\n",
    "\n",
    "+ Second, use pandas to load data/data.csv into a dataframe as shown below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data/all_stocks_5yr.csv\n"
     ]
    }
   ],
   "source": [
    "FILE_NAME = 'all_stocks_5yr.csv'\n",
    "\n",
    "filepath = os.path.join('data', FILE_NAME)\n",
    "print(filepath)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         date   open   high    low  close    volume Name\n",
      "0  2013-02-08  15.07  15.12  14.63  14.75   8407500  AAL\n",
      "1  2013-02-11  14.89  15.01  14.26  14.46   8882000  AAL\n",
      "2  2013-02-12  14.45  14.51  14.10  14.27   8126000  AAL\n",
      "3  2013-02-13  14.30  14.94  14.25  14.66  10259500  AAL\n",
      "4  2013-02-14  14.94  14.96  13.16  13.99  31879900  AAL\n",
      "5  2013-02-15  13.93  14.61  13.93  14.50  15628000  AAL\n",
      "6  2013-02-19  14.33  14.56  14.08  14.26  11354400  AAL\n",
      "7  2013-02-20  14.17  14.26  13.15  13.33  14725200  AAL\n",
      "8  2013-02-21  13.62  13.95  12.90  13.37  11922100  AAL\n",
      "9  2013-02-22  13.57  13.60  13.21  13.57   6071400  AAL\n"
     ]
    }
   ],
   "source": [
    "# read data\n",
    "data = pd.read_csv(filepath)\n",
    "print(data[:10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ds</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>y</th>\n",
       "      <th>volume</th>\n",
       "      <th>Name</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>381385</th>\n",
       "      <td>2013-02-08</td>\n",
       "      <td>102.34</td>\n",
       "      <td>103.330</td>\n",
       "      <td>102.0400</td>\n",
       "      <td>102.66</td>\n",
       "      <td>1937721</td>\n",
       "      <td>MMM</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>381386</th>\n",
       "      <td>2013-02-11</td>\n",
       "      <td>102.39</td>\n",
       "      <td>102.880</td>\n",
       "      <td>102.0401</td>\n",
       "      <td>102.62</td>\n",
       "      <td>1715444</td>\n",
       "      <td>MMM</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>381387</th>\n",
       "      <td>2013-02-12</td>\n",
       "      <td>102.66</td>\n",
       "      <td>103.590</td>\n",
       "      <td>102.6300</td>\n",
       "      <td>103.46</td>\n",
       "      <td>1927930</td>\n",
       "      <td>MMM</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>381388</th>\n",
       "      <td>2013-02-13</td>\n",
       "      <td>103.03</td>\n",
       "      <td>103.395</td>\n",
       "      <td>102.5800</td>\n",
       "      <td>102.86</td>\n",
       "      <td>1699804</td>\n",
       "      <td>MMM</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>381389</th>\n",
       "      <td>2013-02-14</td>\n",
       "      <td>102.43</td>\n",
       "      <td>103.140</td>\n",
       "      <td>102.2200</td>\n",
       "      <td>102.78</td>\n",
       "      <td>2217419</td>\n",
       "      <td>MMM</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                ds    open     high       low       y   volume Name\n",
       "381385  2013-02-08  102.34  103.330  102.0400  102.66  1937721  MMM\n",
       "381386  2013-02-11  102.39  102.880  102.0401  102.62  1715444  MMM\n",
       "381387  2013-02-12  102.66  103.590  102.6300  103.46  1927930  MMM\n",
       "381388  2013-02-13  103.03  103.395  102.5800  102.86  1699804  MMM\n",
       "381389  2013-02-14  102.43  103.140  102.2200  102.78  2217419  MMM"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# change input column name \n",
    "data = data[data['Name']=='MMM'].rename(columns={\"date\":\"ds\", \"close\":\"y\"})\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data Pre-processing\n",
    "Now we need to do data cleaning and preprocessing on the raw data. Note that this part could vary for different dataset.\n",
    "\n",
    "For the stock price data we're using, we add normlization such that the normalized stock prices fall in the range of 0 to 1. And here we aims at using historical values to predict stock prices of future 24 days.\n",
    "\n",
    "We generate a built-in TSDataset to complete the whole processing."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1235\n",
      "24\n"
     ]
    }
   ],
   "source": [
    "from bigdl.chronos.data import TSDataset\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "df = data[[\"ds\", \"y\"]]\n",
    "df_train = df[:-24]\n",
    "df_test = df[-24:]\n",
    "\n",
    "tsdata_train = TSDataset.from_pandas(df_train, dt_col=\"ds\", target_col=\"y\")\n",
    "tsdata_test = TSDataset.from_pandas(df_test, dt_col=\"ds\", target_col=\"y\")\n",
    "\n",
    "minmax_scaler = MinMaxScaler()\n",
    "\n",
    "for tsdata in [tsdata_train, tsdata_test]:\n",
    "    tsdata.scale(minmax_scaler, fit=(tsdata is tsdata_train))\n",
    "\n",
    "train_data = tsdata_train.to_pandas()\n",
    "validation_data = tsdata_test.to_pandas()\n",
    "print(train_data.shape[0])\n",
    "print(validation_data.shape[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ProphetForecaster Demonstration\n",
    "Here we provide a simple demonstration of basic operations with the ProphetForecaster."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/liangs/BigDL/python/orca/src/bigdl/orca/tfpark/zoo_optimizer.py:73: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from bigdl.chronos.forecaster.prophet_forecaster import ProphetForecaster"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:prophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation MSE = 0.003976707703093828\n"
     ]
    }
   ],
   "source": [
    "model = ProphetForecaster()\n",
    "val_mse = model.fit(data=train_data, validation_data=validation_data)['mse']\n",
    "print(f\"Validation MSE = {val_mse}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot predictions\n",
    "pred = model.predict(ds_data=validation_data[[\"ds\"]])\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(validation_data[['y']].values, color='blue', label=\"MMM daily price Raw\")\n",
    "plt.plot(pred[['yhat']].values, color='red', label=\"MMM daily price Predicted\")\n",
    "plt.xlabel(\"Time Period\")\n",
    "plt.ylabel(\"Normalized Stock Price\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## AutoProphet Demonstration\n",
    "Here we provide a demonstration of our AutoProphet AutoEstimator that could search for best hyperparameters for the model automatically."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from bigdl.chronos.autots.model.auto_prophet import AutoProphet\n",
    "from bigdl.orca.automl import hp\n",
    "from bigdl.orca import init_orca_context"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initializing orca context\n",
      "Current pyspark location is : /home/liangs/spark/python/lib/pyspark.zip/pyspark/__init__.py\n",
      "Start to getOrCreate SparkContext\n",
      "pyspark_submit_args is:  --driver-class-path /home/liangs/BigDL/dist/lib/bigdl-dllib-spark_2.4.6-0.14.0-SNAPSHOT-jar-with-dependencies.jar:/home/liangs/BigDL/dist/lib/bigdl-orca-spark_2.4.6-0.14.0-SNAPSHOT-jar-with-dependencies.jar pyspark-shell \n",
      "Successfully got a SparkContext\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-10-29 18:16:13,257\tINFO services.py:1174 -- View the Ray dashboard at \u001b[1m\u001b[32mhttp://10.239.44.108:8265\u001b[39m\u001b[22m\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'node_ip_address': '10.239.44.108', 'raylet_ip_address': '10.239.44.108', 'redis_address': '10.239.44.108:6379', 'object_store_address': '/tmp/ray/session_2021-10-29_18-16-12_676193_9481/sockets/plasma_store', 'raylet_socket_name': '/tmp/ray/session_2021-10-29_18-16-12_676193_9481/sockets/raylet', 'webui_url': '10.239.44.108:8265', 'session_dir': '/tmp/ray/session_2021-10-29_18-16-12_676193_9481', 'metrics_export_port': 54088, 'node_id': '196278afbbd9b14a560380d765ba647559ee85f869e72b8a58353531'}\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "        <div>\n",
       "            <p><b>SparkContext</b></p>\n",
       "\n",
       "            <p><a href=\"http://rose-X299-AORUS-Gaming-3-Pro.sh.intel.com:4040\">Spark UI</a></p>\n",
       "\n",
       "            <dl>\n",
       "              <dt>Version</dt>\n",
       "                <dd><code>v2.4.3</code></dd>\n",
       "              <dt>Master</dt>\n",
       "                <dd><code>local[10]</code></dd>\n",
       "              <dt>AppName</dt>\n",
       "                <dd><code>pyspark-shell</code></dd>\n",
       "            </dl>\n",
       "        </div>\n",
       "        "
      ],
      "text/plain": [
       "<SparkContext master=local[10] appName=pyspark-shell>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "init_orca_context(cores=10, init_ray_on_spark=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "== Status ==<br>Memory usage on this node: 6.2/125.5 GiB<br>Using FIFO scheduling algorithm.<br>Resources requested: 0/10 CPUs, 0/0 GPUs, 0.0/75.59 GiB heap, 0.0/25.1 GiB objects<br>Current best trial: 3f259_00024 with mse=0.0016274785265043075 and parameters={'changepoint_prior_scale': 0.03540871187287501, 'seasonality_prior_scale': 5.864530192114387, 'holidays_prior_scale': 8.039723193745793, 'seasonality_mode': 'additive', 'changepoint_range': 0.8774317656117707, 'expect_horizon': '123 days 00:00:00', 'cross_validation': False}<br>Result logdir: /tmp/auto_prophet_logs/auto_prophet<br>Number of trials: 50/50 (50 TERMINATED)<br><br>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2021-10-29 18:16:33,623\tINFO tune.py:450 -- Total run time: 19.45 seconds (19.32 seconds for the tuning loop).\n",
      "INFO:prophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training completed.\n",
      "CPU times: user 3.36 s, sys: 441 ms, total: 3.8 s\n",
      "Wall time: 20.8 s\n"
     ]
    }
   ],
   "source": [
    "%%time \n",
    "auto_prophet = AutoProphet()\n",
    "auto_prophet.fit(data=train_data,\n",
    "                 cross_validation=False,\n",
    "                 freq=\"1D\")\n",
    "\n",
    "print(\"Training completed.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_hat = auto_prophet.predict(ds_data=validation_data[[\"ds\"]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation MSE = [array(0.00477733)]\n"
     ]
    }
   ],
   "source": [
    "test_mse = auto_prophet.evaluate(data=validation_data, metrics=[\"mse\"])\n",
    "print(f\"Validation MSE = {test_mse}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEGCAYAAABy53LJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3dd3xUZfb48c8hlABSpKh0iFJ3KVKlKQqr4ioC6iqiArqLCLjqgi7u7lex94KuP7EhogiWVUDFShFQYAkuIKJgpCiIgiAYesr5/fHcIUOYSWbCTO4kc96v133NzHPLnIQhZ+5TRVUxxhhjIlXG7wCMMcaULJY4jDHGRMUShzHGmKhY4jDGGBMVSxzGGGOiUtbvAIpDrVq1tHHjxn6HYYwxJcry5ct/UdXa+cuTInE0btyY9PR0v8MwxpgSRUQ2hSq3qipjjDFRscRhjDEmKpY4jDHGRCUp2jhCycrKYvPmzRw4cMDvUIw5LDU1lfr161OuXDm/QzEmrKRNHJs3b6ZKlSo0btwYEfE7HGNQVXbs2MHmzZtp0qSJ3+EYE1bSVlUdOHCAmjVrWtIwCUNEqFmzpt0Fm4SXtIkDsKRhEo59Jk1JkNSJwxgTvawsmDgRMjP9jsT4xRKHj0SEK6644vDr7Oxsateuzfnnnw/A5MmTERE++eSTw8fMmDEDEeHNN98EoFevXjRs2JDgdVX69+/PcccdV+j7jx8/nocffrjAYyZOnMiUKVMAGDp06OH3jaVZs2Zx//33H/N1evXqRfPmzWnbti2dOnVixYoVMYjO5Pfuu3DddTB6tN+RGL9Y4vBR5cqVWb16Nfv37wfg448/pl69ekcc07p1a6ZPn3749bRp02jbtu0Rx1SvXp3PPvsMgF27drF169aYxThixAiuuuqqmF0vv+zsbPr168e4ceNicr2pU6eycuVKRo4cyc033xyTa5ojvfeee5wyBeLwPcKUAJY4fHbeeefxnvc/cdq0aQwaNOiI/T179uS///0vWVlZ7Nmzh4yMDNq1a3fEMZdddtnh5PLWW28xcODAsO93zz330KxZM3r06MHatWsPlz/33HN06tSJtm3bctFFF7Fv3z4g9F3J3Llz6d+//+HXH3/8MQMGDDjqvRo3bswtt9xC69at6dy5MxkZGYC7cxkxYgRdunThlltuYfLkyYz2vr7+/PPPDBgwgLZt29K2bVs+//xzAF555RU6d+5Mu3btuPbaa8nJySngtwpdu3Zly5YtAOzZs4fevXvTvn17WrduzcyZMwF46KGHeOKJJwC46aabOOussw7/fIMHDy7w+slKFWbPhgsvhE6d4NprIYbfU0wJYYkDuPFG6NUrttuNN0b23oE/+gcOHGDVqlV06dLliP0iQp8+ffjwww+ZOXMm/fr1O+oavXv3ZsGCBeTk5DB9+nQuvfTSkO+1fPlypk+fzooVK5g9ezbLli07vG/gwIEsW7aMlStX0rJlS1544YWwMZ955pl88803bN++HYAXX3yRq6++OuSx1apV48svv2T06NHcGPRL2bx5M59//jmPPvroEcf/9a9/5YwzzmDlypV88cUX/O53v+Prr7/mtdde47PPPmPFihWkpKQwderUsPEBfPDBB4eTW2pqKm+//TZffPEF8+bNY8yYMagqPXv2ZOHChQCkp6ezZ88esrKyWLhwIaeffnqB109WK1e6RHHhhfDyy7B/P1x9tUsoJnlY4vBZmzZt2LhxI9OmTeO8884LeUwguUyfPv2oOxKAlJQUevTowfTp09m/fz/hZgJeuHAhAwYMoFKlSlStWvWIJLR69Wp69uxJ69atmTp1Kl999VXYmEWEK6+8kldeeYVdu3axePFi+vbtG/LYQLyDBg1i8eLFh8svueQSUlJSjjp+7ty5XHfddYd/rmrVqjFnzhyWL19Op06daNeuHXPmzGH9+vUh32/w4ME0adKEe+65h1GjRgFufMQ//vEP2rRpQ58+fdiyZQs///wzHTp0YPny5fz2229UqFCBrl27kp6ezsKFC+nZs2fYnz+ZzZ7tHvv2hebN4aGH4IMPXGO5SR5JOwAw2OOP+/v+/fr1Y+zYscyfP58dO3Yctb9z5858+eWXVKpUiWbNmoW8xmWXXcaAAQMYP358kWIYOnQoM2bMoG3btkyePJn58+cXePywYcO44IILSE1N5ZJLLqFs2dAfpeDupcHPK1euHHFsqsqQIUO47777Cj126tSpdOjQgZtvvpnrr7+et956i6lTp7J9+3aWL19OuXLlaNy4MQcOHKBcuXI0adKEyZMn061bN9q0acO8efPIyMigZcuWEceXTN57Dzp0gJNOcq9HjoR33oExY6B3bwjz8TSljN1xJICrr76a22+/ndatW4c95v777+fee+8Nu79nz57ceuutIe9IAk4//XRmzJjB/v37yczM5J133jm8LzMzkzp16pCVlVVoNRBA3bp1qVu3LnfffTfDhg0Le9xrr712+LFr166FXrd37948/fTTAOTk5LB792569+7Nm2++ybZt2wDYuXMnmzaFnO0ZcAnqrrvuYsmSJXzzzTfs3r2bE044gXLlyjFv3rwjzu3ZsycPP/wwp59+Oj179mTixImceuqpNp4ihB07YMkSCL4xFoFJkyA1Fa68ErKz/YvPFJ+4JQ4RmSQi20RkdZj9LURksYgcFJGx+fadKyJrRSRDRMYFlTcRkaVe+WsiUj5e8Ren+vXr89e//rXAY/r27cuZZ54Zdr+IMHbsWGrVqhX2mPbt23PppZfStm1b+vbtS6dOnQ7vu+uuu+jSpQvdu3enRYsWEcU9ePBgGjRoUOC3819//ZU2bdowYcIEHnvssUKvOWHCBObNm0fr1q3p0KEDa9asoVWrVtx9992cffbZtGnThj/84Q+F9hyrWLEiY8aM4aGHHmLw4MGkp6fTunVrpkyZcsTP17NnT7Zu3UrXrl058cQTSU1NtWqqMD76CHJz4Y9/PLK8bl145hn473+hgO82pjRR1bhswOlAe2B1mP0nAJ2Ae4CxQeUpwHdAGlAeWAm08va9DlzmPZ8IXBdJLB06dND81qxZc1SZic6oUaP0+eefD7u/UaNGun379mKMqHRI1M/m4MGqtWqpZmeH35+Sovrf/xZvXCZ+gHQN8Tc1bnccqroA2FnA/m2qugzIyrerM5ChqutV9RAwHbhQXN3BWUCg5/hLQH+MLzp06MCqVauOGMBoSq+cHNcIfu65EKJPAwD//jfUqQNXXAFeb25TSiViG0c94Ieg15u9sprALlXNzlcekogMF5F0EUkPdBs1sbN8+XIWLFhAhQoVwh6zcePGAqvOTMmxbJlr48hfTRWsenV46SVYtw5uuaX4YjPFLxETR0yo6rOq2lFVO9aufdRa68aYKLz3HpQpA2efXfBxZ50FN90ETz3l7lBM6ZSIiWML0CDodX2vbAdQXUTK5is3xsTZ7NnQtSvUqFH4sffeC61auYGBIXqXm1IgERPHMqCp14OqPHAZMMtrqJkHXOwdNwSY6VOMxiSNrVvhiy8KrqYKlpoKr7wCv/ziJkO0UeWlTzy7404DFgPNRWSziFwjIiNEZIS3/yQR2Qz8DfiXd0xVrw1jNPAh8DXwuqoGhjH/HfibiGTg2jzCz4thjImJ9993j2EmNgjp1FPhjjvgjTfg1VfjE5fxTzx7VQ1S1TqqWk5V66vqC6o6UVUnevt/8sqrqmp17/lv3r7ZqtpMVU9W1XuCrrleVTur6imqeomqHoxX/MXBplV34jGtevfu3Y+YxDFawRMvBv8OQtm4cSOvFuGvY7x+n7E2ezbUqwdt2kR33i23QLduMGoUfP99fGIz/kjEqqqkYdOqx29a9SFDhoScVr2wWXVDKex3UNTEURJkZbmBf+ed50aJRyMlxU2EmJMDQ4e6wYOmdLDE4TObVj0+06qffvrph9/vuOOOY8yYMbRt25bFixeHvdaLL75Is2bN6Ny58+FEnP93kJGRQZ8+fWjbti3t27fnu+++Y9y4cSxcuJB27drx2GOPkZOTw80330ynTp1o06YNzzzzDOAG244ePZrmzZvTp0+fw1OoJLJFi9xKf9FUUwVLS3Nzwc2bBxMmxDY24x9LHODrvOo2rXp8plV/5513Ds/9tXfvXrp06cLKlSupWbNmyGtt3bqV22+/nc8++4xFixaxZs2akNcdPHgwo0aNYuXKlXz++efUqVOH+++/n549e7JixQpuuukmXnjhBapVq8ayZctYtmwZzz33HBs2bODtt99m7dq1rFmzhilTphxOiols9mwoV85NYFhUV18N/frBrbfC6pATEJmSxmbH9Vmk06o/8cQT7N69m0ceeeSoyQ6LMq06cNS06v/617/YtWsXe/bs4Zxzzgkbc/C06sOGDWPx4sVh2wCCp1W/6aabDpcXNK164FqBadVffvnlw9OqA+zfv58TTjgh5PsNHjyYihUr0rhxY5588snD17nooosAjpiiPfhaS5cupVevXgTG/Fx66aWsW7fuiGtnZmayZcuWw3dXqampIWP46KOPWLVq1eH2i927d/Ptt9+yYMECBg0aREpKCnXr1j28cFQimz0bzjgDqlQp+jVE4LnnoEULGD/eVg0sDSxxgO/zqtu06gXTKKdV79ix4xFlqamph5NUuGvNmDEj4ngiiffJJ588KvnODixmUUJs3Ahr1sCf/3zs1zrhBHfnMWGC695bp86xX9P4x6qqEoBNq54nFtOqF3b9UNfq0qULn376KTt27CArK4s33njjqHOrVKlC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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot predictions\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(validation_data[['y']].values, color='blue', label=\"MMM daily price Raw\")\n",
    "plt.plot(y_hat[['yhat']].values, color='red', label=\"MMM daily price Predicted\")\n",
    "plt.xlabel(\"Time Period\")\n",
    "plt.ylabel(\"Normalized Stock Price\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "5fd0d186da03a3cc4467b80ade5453b676349bbfc4f1af2284fe352fa0ffaaf6"
  },
  "kernelspec": {
   "display_name": "Python 3.6.10 64-bit ('env': conda)",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
